///********************************************************************
///* Copyright © 2011 fishr (fishr.flash@gmail.com)  
///********************************************************************


package su.fishr.effects.prismavision 
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	
	import su.fishr.effects.prismavision.PV_view;
	
   /**
	 * 		Обеспечивает передачу параметров,
	 *	сигналов. Синхронизацию работы
	 *	компонентов.
	 *	Предоставляет сквозные accessors для
	 *	"сквозной" передачи параметров в 
	 *	модель и вьюер. Контролирует передачу
	 *	сквозных параметров, если они не 
	 *	отличаются от текущих прерывает передачу.
	 * 
	 * @version                1.0
	 * @playerversion          Flash 9
	 * @langversion            3.0
	 * @author                 fishr
	 * @created                15.08.2011 18:15
	 * @since                  15.08.2011 18:15
	 * 
	 * @private
	 */
	public class PV_control extends EventDispatcher
	{
		
		
	/**-------------------------------------------------------------------------------
	* 
	*	   						V A R I A B L E ' S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
	    static public const AUTHOR:String = "fishr (fishr.flash@gmail.com)";
		static public const UPLOAD_PARAM:String = "uploadParam";
		static public const END_ROTATION:String = "endRotation";
			
		private var _model:PV_model;
		private var _view:PV_view;
		private var _replacedImages:Boolean;
		///в нaчале вращения устанавливается в
		///true, после окончания в false
		private var _activeTurn:Boolean;
		private var _manualStart:Boolean;

	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*	 						P R O P E R T I E S 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function get view():PV_view 
		{
			return _view;
		}
		
		///флаг указывающий замену или слияние массивов
		///изображений.
		public function set replacedImages(value:Boolean):void 
		{
			_replacedImages = value;
		}
		
		public function get nextNbElem():int
		{
			return _model.nowImgNb;
		}
		
		public function set nextNbElem(nm:int):void
		{
			if ( _model.nowImgNb === nm || nm === -1) return;
			_model.nowImgNb = nm;
		}
		
		///контроль и передача данных в модель
		public function set wPrisma(value:int):void 
		{
			if ( _model.wPrisma === value ) return;
			_model.wPrisma = value;
			_view.replaceHolders = true;
		}

		public function set delay(value:Number):void 
		{
			if ( _model.delay === value * 1000 || value <= 0 ) return;
			_model.delay = value * 1000;
		}
		
		public function set duration(value:Number):void 
		{
			if ( _model.duration === value || value <= 0) return;
			_model.duration = value;
		}

		public function set countRows(value:int):void 
		{
			if ( _model.countRows === value ) return;
			_model.countRows = value;
			_view.replaceHolders = true;
			
		}

		public function set manualStart(value:Boolean):void 
		{
			_manualStart = value;
			if ( _activeTurn ) _model.manualStart = false;
			else _model.manualStart = value;
		}

		public function set fps( value:int ):void
		{
			if ( _model.fps === value ) return;
			_model.fps = value;
		}
		
		public function set useFilters(value:Boolean):void 
		{
			if ( _model.useFilters === value ) return;
			_model.useFilters = value;
			_view.replaceHolders = true;
		}
		
		public function set smooth( value:int ):void
		{
			if ( _model.smooth === value ) return;
			_model.smooth = value;
		}
		
		public function set verticalOrient(value:Boolean):void 
		{
			if ( _model.vertical === value ) return;
			_model.vertical = value;
			_view.replaceHolders = true;
		}

		public function set senseOfRotate(value:int):void 
		{
			if ( _view.senseOfRotate === value ) return;
			if ( value < 1 || value > 4 ) value = 1;
			_view.senseOfRotate = value;
		}


		public function set verticalRotation(value:Boolean):void 
		{
			///если в модели установлена верт. нарезка
			///изменяем данные зеркально, чтобы выровнять.
			if ( _model.vertical === true)
			{
				value === true? value = false : value = true;
			}
			if ( _view.vertical === value ) return;
			_view.vertical = value;
		}

		public function set asyn(value:Number):void 
		{
			if ( _view.asyn === value ) return;
			_view.asyn = value;
		}
		public function set blur(value:Number):void 
		{
			if ( _view.blur === value ) return;
			_view.blur = value;
		}
		
		public function set gradient(value:Number):void 
		{
			if ( _view.gradient === value ) return;
			_view.gradient = value;
		}
		
		public function set corrBrightness( value:Number ):void
		{
			if ( _view.corrBrightness === value ) return;
			_view.corrBrightness = value;
			_view.replaceHolders = true;
		}
		
		public function set factorShadow( value:Number ):void
		{
			if ( _view.factorShadow === value ) return;
			_view.factorShadow = value;
			_view.replaceHolders = true;
		}
		
		public function set arrImg(value:Array):void 
		{
			/// Самый первый раз, когда массив изображений только что получен.
			if ( !_model.arrImg )
			{
				_model.arrImg = value.splice(0);
				_model.startTimer();
				_view.replaceHolders = false;
			}
			else if ( _replacedImages === true )
			{
				_model.arrImg = value.splice(0);
				_model.nowImgNb = 0;
				_replacedImages = false;
			}
			else
			{
				_model.arrImg = _model.arrImg.concat( value );
			}	
				
			if ( _view.replaceHolders === true)
			{
				///Возвращаем предидущий номер эл-та массива изображений
				_model.nowImgNb = _model.nowImgNb === 0? _model.arrImg.length - 1: _model.nowImgNb - 1;
				_model.addEventListener( PV_model.CREATE_DATAS, createNewDatasHandler);
			}
			
			_model.createDatas();
			

		}	
		
		public function get arrImg():Array
		{
			return _model.arrImg;
		}
		
		public function get activeTurn():Boolean 
		{
			return _activeTurn;
		}

	//}
	/**-------------------------------------------------------------------------------
	* 
	*								P U B L I C 	
	* 
	* --------------------------------------------------------------------------------
	*/
	//{
		public function PV_control(target:IEventDispatcher = null)
		{
			super(target);
			
			init();

		}
		

		
		public function destroyObjects():void
		{
			_view.removeEventListener( PV_view.END_ROTATION_CYCLE, endRotationHandler );
			_model.removeEventListener( PV_model.GO_UPLOAD_PARAM, uploadParamHandler);
			_model.removeEventListener( PV_model.CREATE_DATAS, createNewDatasHandler);
			_view.destroyThis();
		}

	//}
	
	/**-------------------------------------------------------------------------------
	* 
	*								P R I V A T E 	
	* 
	* --------------------------------------------------------------------------------
	*/	
	//{
		private function init():void 
		{
			_model = new PV_model();
			_view = new PV_view( _model );
			_model.addEventListener( PV_model.GO_UPLOAD_PARAM, uploadParamHandler);
		}
		
		private function uploadParamHandler(e:Event):void 
		{
			///устанавливаем флаг для того
			///чтобы обращение к методу вкл. ручного
			///вращения не привело к непосредственной
			///инициализации выполнения в период
			///исполнения вращения
			_activeTurn = true;
			
			
			_view.addEventListener( PV_view.END_ROTATION_CYCLE, endRotationHandler );
			this.dispatchEvent( new Event( PV_control.UPLOAD_PARAM) );
		}
		
		
		///если изменились параметры требующие обновления
		///вьюера
		private function createNewDatasHandler(e:Event):void 
		{
			_model.removeEventListener( PV_model.CREATE_DATAS, createNewDatasHandler);
			_model.delayEndHandler(null);
		}
		
		private function endRotationHandler(e:Event):void 
		{
			_activeTurn = false;

			_view.removeEventListener( PV_view.END_ROTATION_CYCLE, endRotationHandler );
			this.dispatchEvent( new Event( END_ROTATION ));
			///если значение флага руч. старта не изменилось вкл. таймер ожидания
			if (!_manualStart && !_model.manualStart )_model.startTimer();
			///если руч. старт был отключен во время поворота передаем изм. в модель
			else if ( !_manualStart && _model.manualStart )
			{
				_model.startTimer();
				_model.manualStart = false;
			}
			///если зн. флага изменилось во время поворота передаем изменение в модель
			else if ( _manualStart && !_model.manualStart ) _model.manualStart = true;
		}
		
		

	//}
		
		
	}

}